package com.itheima.ssm.dao;

import com.itheima.ssm.domain.Member;
import com.itheima.ssm.domain.Order;
import com.itheima.ssm.domain.Product;
import org.apache.ibatis.annotations.*;

import java.util.List;

public interface IOrderDao {
    /**
     * 查询所有订单，返回一个list集合
     * 分析此处的sql该如何实现：
     *      首先明白我们的需求：返回order的详细信息，这里涉及一个多表查询，因为order表中关联着product信息
     *      因为订单信息中肯定包含产品信息，所以我们无法使用简单的一对一模型来查询数据，因为无法对应product
     *      的数据只能对应于product，而order中没有product相关属性，所以这里需要使用集合来处理，这是mybatis
     *      处理复杂映射关系的一种方式，主要涉及的注解@Result(property="Bean属性",column="数据库中表的字段")
     *      javaType=Product.class（封装到一个Product类型中） one=@One(select="")(@One实现的就是一个一对一查询注解)
     *      由于我们徐亚通过order表中的外键查找出product的信息，所以在product中我们需要额外设置一个方法通过id查找
     *      产品信息的方法，这一点可以直接写在Produtc类中通过sql注解的方式实现，然后再OrderDao中调用即可
     * @return
     */
    @Select("select * from orders")
    @Results({ // 封装到映射的结果集合中
            /*order自身的属性就封装到自己，product的属性单独封装到product中*/
            @Result(id = true,property = "id",column = "id"),
            @Result(property = "orderNum",column = "orderNum"),
            @Result(property = "orderTime",column = "orderTime"),
            @Result(property = "orderStatus",column = "orderStatus"),
            @Result(property = "peopleCount",column = "peopleCount"),
            @Result(property = "payType",column = "payType"),
            @Result(property = "orderDesc",column = "orderDesc"),
            @Result(property = "product",column = "productId",javaType = Product.class,one = @One(select = "com.itheima.ssm.dao.IProductDao.findById")),
    })
    List<Order> findAll() throws Exception;


    /**
     * 通过id查询订单的详细信息
     * @param orderId
     * @return
     * @throws Exception
     */
    @Select("select * from orders")
    @Results({ // 封装到映射的结果集合中
            /*order自身的属性就封装到自己，product的属性单独封装到product中*/
            @Result(id = true,property = "id",column = "id"),
            @Result(property = "orderNum",column = "orderNum"),
            @Result(property = "orderTime",column = "orderTime"),
            @Result(property = "orderStatus",column = "orderStatus"),
            @Result(property = "peopleCount",column = "peopleCount"),
            @Result(property = "payType",column = "payType"),
            @Result(property = "orderDesc",column = "orderDesc"),
            // 对于product和member而言都是比较简单的操作，因为都是一对一的关系
            // 难点在于如何查询到所有的游客信息
            // 实际上通过orderid我们查询到
            @Result(property = "product",column = "productId",javaType = Product.class,one = @One(select = "com.itheima.ssm.dao.IProductDao.findById")),
            @Result(property = "member",column = "memberId",javaType = Member.class,one = @One(select = "com.itheima.ssm.dao.IMemberDao.findById")),
            @Result(property = "traveller",column = "id",javaType = java.util.List.class,many = @Many(select = "com.itheima.ssm.dao.ITravellerDao.findById"))
    })
    Order findById(int orderId) throws Exception;
}


































